/**
 * 抽象类
 * 抽象描述一种抽象的状态，无法被实例化，只能被继承
 * 抽象方法不能在抽象类中实现，只能在具体子类中实现，而且必须实现
 *
 * */

abstract class Animal {
    name: string;

    abstract speak(): void

}

class Cat extends Animal {
//    实现抽象类
    /*speak(): void {
        console.log('喵喵喵')
    }*/
    speak(): any {
        console.log('喵喵喵')
    }

}

let cat = new Cat();
cat.speak();

class Dog extends Animal {
//    实现抽象类里面的方法
    speak(): void {
        console.log('汪汪汪')
    }


}

let dog = new Cat();
dog.speak();

/**
 * 修饰符
 * 1.访问控制修饰符:private,protected,public
 * 2.只读，readonly 用在编译阶段
 * 3.静态属性 static
 * 4.抽象类，抽象方法 abstract
 * */


/**
 * 重写和重载   (继承和多态)
 * 重载：为一个函数提供多个类型定义或者函数声明   （参数类型不同，但是返回值类型必须一致！！）
 * 重写：不同的子类以不同的方式实现父类的方法 （多个子类，每个子类实现父类方法的方式不同）
 * */


export {}
